package cn.zhage.aimin.canal1.es.service;

import cn.zhage.aimin.base.model.DrugIndex;
import cn.zhage.aimin.canal1.es.mapper.DrugIndexMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

/**
 * 药品索引服务
 * 
 * 负责处理药品数据与Elasticsearch之间的交互操作
 * 使用EasyES框架简化Elasticsearch操作
 * 
 * 主要功能：
 * 1. 药品数据的增删改查
 * 2. 与Canal数据同步配合，实现MySQL到ES的数据同步
 * 3. 提供统一的ES操作接口
 * 
 * 安全特性：
 * - 所有操作都进行空值检查，防止数据异常
 * - 使用drugId作为文档唯一标识
 * - 提供防御性编程保护
 * 
 * @author 渣哥
 */
@Service
@RequiredArgsConstructor
public class DrugIndexService {

    /**
     * 药品索引数据访问对象
     * 基于EasyES框架的BaseEsMapper，提供基础的CRUD操作
     */
    private final DrugIndexMapper drugIndexMapper;

    /**
     * 更新药品索引数据
     * 
     * 使用场景：Canal监听到MySQL UPDATE操作时调用
     * 
     * 安全检查：
     * - 验证drugId不为空，确保ES文档有有效的标识
     * - 防止因数据异常导致的ES操作失败
     * 
     * @param object 待更新的药品索引对象
     */
    public void update(DrugIndex object){
        // 防御性编程：检查drugId是否为空
        // drugId是ES文档的唯一标识，为空时无法进行更新操作
        // 直接返回避免ES操作异常，提高系统稳定性
        if(object.getDrugId() == null){
            return ;
        }
        
        // 使用EasyES的updateById方法更新文档
        // 根据drugId定位ES文档并更新整个文档内容
        drugIndexMapper.updateById(object);
    }

    /**
     * 插入新的药品索引数据
     * 
     * 使用场景：Canal监听到MySQL INSERT操作时调用
     * 
     * 安全检查：
     * - 验证drugId不为空，确保ES文档有有效的标识
     * - 防止创建无效的ES文档
     * 
     * @param object 待插入的药品索引对象
     */
    public void insert(DrugIndex object){
        // 防御性编程：检查drugId是否为空
        // drugId是ES文档的主键，为空时无法创建有效文档
        // 避免在ES中创建无效或无法检索的文档
        if(object.getDrugId() == null){
            return ;
        }
        
        // 使用EasyES的insert方法插入新文档
        // drugId会自动映射为ES文档的_id字段
        drugIndexMapper.insert(object);
    }

    /**
     * 删除药品索引数据
     * 
     * 使用场景：Canal监听到MySQL DELETE操作时调用
     * 
     * 安全检查：
     * - 验证drugId不为空，确保能够准确定位要删除的文档
     * - 防止因ID为空导致的删除操作失败
     * 
     * @param object 待删除的药品索引对象
     */
    public void delete(DrugIndex object){
        // 防御性编程：检查drugId是否为空
        // 删除操作需要明确的文档ID，为空时无法定位目标文档
        // 避免执行无效的删除操作，保证操作的准确性
        if(object.getDrugId() == null){
            return ;
        }
        
        // 使用EasyES的deleteById方法删除文档
        // 根据drugId精确删除对应的ES文档
        drugIndexMapper.deleteById(object.getDrugId());
    }
}
